package com.itheima.d09_stream_middle_method;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * 目标：掌握Stream流常用的中间方法
 */
public class Test {

    public static void main(String[] args) {
        //准备测试数据：
        List<Student> students = new ArrayList<>();
        students.add(new Student("小王", 18, 66));


        students.add(new Student("小张", 17, 99));
        students.add(new Student("小李", 26, 20));
        students.add(new Student("小赵", 16, 77));
        students.add(new Student("小刘", 19, 18));
        students.add(new Student("小李", 26, 20));


        //需求1：获取成绩及格的所有学生，按照成绩降序输出
        students.stream()
                //中间处理
                .filter(s ->s.getScore() >= 60)
                .sorted((s1,s2)->Double.compare(s2.getScore(), s1.getScore()))
                //终结处理
                .forEach(System.out::println);

        System.out.println("============");

        //需求2：找出年纪大于18，小于等于25的学生，按照年纪升序输出
        students.stream()
                .filter(s ->s.getAge() >= 17)
                .filter(s ->s.getAge() <= 25)
                .sorted((s1,s2)->s1.getAge()-s2.getAge())
                .forEach(System.out::println);

        System.out.println("============");

        //需求3：获取考试成绩前三名
        //方式一：sorted+limit
        students.stream()
                .sorted((s1,s2)->Double.compare(s2.getScore(), s1.getScore()))
                .limit(3)
                .forEach(System.out::println);

        System.out.println("============");

        //方式二：sorted+skip
        students.stream()
                .sorted((s1,s2)->Double.compare(s1.getScore(), s2.getScore()))
                .skip(students.size()-3)
                .forEach(System.out::println);

        System.out.println("============");

        //需求4：找出年纪大于18的学生姓名，去除重复的姓名
        students.stream()
                .filter(s ->s.getAge() > 18)
                .distinct() //hashCode+equals进行去除
                .forEach(System.out::println);

        System.out.println("============");

        //需求5：将成绩及格学生，包装成老师，按照年纪升序输出
        students.stream()
                .filter(s ->s.getScore() >= 60)
                .map(s->new Teacher(s.getName(), s.getAge()))
                .sorted((t1,t2)->t1.getAge()-t2.getAge())
                .forEach(System.out::println);

        System.out.println("============");

        //需求6：过滤出未成年 + 过滤出不及格
        Stream<Student> s1 = students.stream()
                .filter(s -> s.getAge() < 18);
        //s1.forEach(System.out::println);

        //注意：合并流之前，不能对流进行终结操作（流关闭）
        Stream<Student> s2 = students.stream()
                .filter(s -> s.getScore() < 60);

        Stream.concat(s1,s2)
                .forEach(System.out::println);

    }
}
